package com.ds.infra.im.codec;

import com.ds.infra.im.protocol.ProtocolMsg;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * 自定义协议解码器
 */
public class CustomProtocolDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 检查可读字节数是否足够基本长度 (2+1+1+1+4=9字节)
        if (in.readableBytes() < 9) {
            return;
        }

        // 标记当前读取位置
        in.markReaderIndex();

        // 1. 读取魔数并验证
        short magicNumber = in.readShort();
        if (magicNumber != ProtocolMsg.MAGIC_NUMBER) {
            // 魔数不匹配，关闭连接
            ctx.close();
            return;
        }

        // 2. 读取版本号
        byte version = in.readByte();

        // 3. 读取序列化算法
        byte serializerAlgorithm = in.readByte();

        // 4. 读取指令类型
        byte command = in.readByte();

        // 5. 读取数据长度
        int length = in.readInt();

        // 检查剩余可读字节是否足够数据长度
        if (in.readableBytes() < length) {
            // 重置读取位置，等待更多数据
            in.resetReaderIndex();
            return;
        }

        // 6. 读取数据内容
        byte[] data = new byte[length];
        in.readBytes(data);

        // 构建协议对象并添加到输出列表
        ProtocolMsg protocol = new ProtocolMsg(version, serializerAlgorithm, command, length, data);
        out.add(protocol);
    }
}
